package com.gem.day17;

import java.lang.reflect.*;

/**
 * 本类用来演示Java反射获取方法并且调用
 * 
 * @author easonsy
 * 2020年8月13日 上午11:21:08
 */
public class ReflectMethod {
	public static void main(String[] args) {
		Class<?> c = Point.class;
		//获取所有公开的方法,并且包含父类继承的
		//Method[] methods = c.getMethods();

		//获取所有的方法,包括私有化方法,但是不包括父类
		Method[] methods = c.getDeclaredMethods();
		for (Method m : methods) {
			//System.out.println(m);
			String result = "";
			//修饰符
			result += Modifier.toString(m.getModifiers()) + " ";
			//返回类型
			result += processName(m.getReturnType().getName()) + " ";
			//方法名
			result += m.getName() + "(";
			//参数列表
			Class<?>[] parameterTypes = m.getParameterTypes();
			for (int i = 0; i < parameterTypes.length; i++) {
				result += i == parameterTypes.length - 1 ? parameterTypes[i].getName()
						: parameterTypes[i].getName() + ", ";
			}
			result += "){}";
			System.out.println(result);
		}

		System.out.println("---------------------------------");

		//反射方法调用
		try {
			Point p = (Point) c.getConstructor().newInstance();
			//1.空参void
			Method m1 = c.getMethod("method1");
			//调用
			m1.invoke(p);

			//2.静态
			Method m2 = c.getMethod("method2");
			m2.invoke(p);

			//3.有返回值有参数方法
			Method m3 = c.getMethod("method3", int.class, int.class);
			int result = (int) m3.invoke(p, 5, 10);
			System.out.println(result);

			//4.私有化方法的调用
			Method m4 = c.getDeclaredMethod("method4");
			//开启访问权限
			m4.setAccessible(true);
			m4.invoke(p);
		} catch (NoSuchMethodException | SecurityException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 处理全限定名
	 */
	private static String processName(String className) {
		if (className != null && className.lastIndexOf(".") != -1) {
			return className.substring(className.lastIndexOf(".") + 1);
		}
		return className;
	}
}
